// 接口： TypeScript的核心原则之一是对值所具有的结构进行类型检查
// 作用： 接口的作用就是为这些类型命名和为你的代码或第三方代码定义契约。
// 契约:  是一种约定， 双方或者多方都要去遵守
export { };

// 问题
const obj: object = {}
const fn: object = () => { }
const arr: object = [1, 2, 3, 4]
const num: object = new Number(123)

// 1. 对象接口
interface ObjState {
	// 必须属性
	name: string
	age: number
	// 可选属性
	sex?: string
	// 只读属性
	readonly code: number
	// 其他属性
	[propsName: string]: any
}

const obj1: ObjState = {
	code: 100,
	name: '张三',
	age: 18,
	sex: '男',
	like: ['打球', '花花'],
	height: 180
}

const obj2: ObjState = {
	code: 120,
	name: '李四',
	age: 18,
}


// 2. 数组接口
interface ArrState {
	[propsName: number]: string | boolean
}


const arr1: ArrState = ['a', 'b', 'c', true]


// 3. 类接口
interface PersonState {
	name: string
	age: number
}

class Person implements PersonState {
	name = '张三'
	age = 18
}


// 4. 函数接口
interface FnState {
	(x: number, y: number): number
}


function add(a: number, b: number) {
	return a + b
}

const sadd: FnState = add

// 5. ...